package com.zhu.instructions.math;

// instructions/math/Frem.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;

/**
 * 指令：frem
 *
 * 操作数：无
 *
 * 功能：
 *  对栈顶两个 float 值进行求余运算：value1 % value2
 *
 * 栈变化：
 *      ..., value1, value2 → ..., result
 *
 * 特殊情况（根据 IEEE 754）：
 *  - 如果 value2 == 0 或 value1 为无穷大，则结果为 NaN
 *  - 不会抛出 ArithmeticException
 *
 * 实现方式：
 *  使用 Math.IEEEremainder(v1, v2)，但 Java 的 % 操作符已符合规范
 *  所以直接使用 % 即可
 */
public class FREM extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        float v2 = stack.popFloat(); // 除数
        float v1 = stack.popFloat(); // 被除数

        float result = v1 % v2; // IEEE 754 兼容，自动处理 NaN
        stack.pushFloat(result);
    }
}